package com.chinackts.customsdeclarations.service;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.chinackts.auth.model.RdTime;
import com.chinackts.auth.service.HeaderStoreService;
import com.chinackts.auth.service.RdTimeService;
import com.chinackts.common.okhttp.OkHttpRequest;
import com.chinackts.customsdeclarations.model.DecModType;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.net.URLEncoder;

/**
 * @author Lianhong
 * @since 2022/4/19
 * 电子口岸采集服务调用 单一窗口的修撤单列表接口，报关单存在修撤单数据，则不继续采集关单明细
 * 【目前电子口岸 和 单一窗口服务端采用的是同一套权限验证体系，故可以混用】
 */
@Service
public class RevokeListService {

    private static final Logger LOGGER = LoggerFactory.getLogger(RevokeListService.class);

    private static final String REVOKE_LIST_URL = "https://swapp.singlewindow.cn/decmmodserver/sw/mmod/queryRevokeList";

    @Resource(name = "proxyOkHttpRequest")
    private OkHttpRequest request;

    @Resource
    private RdTimeService rdTimeService;
    @Resource
    private HeaderStoreService headerStoreService;

    /**
     * 根据报关单号查询 单一窗口修撤单
     */
    public JSONObject revokeList(String id, String entryId) {
        //目前修撤单必须使用rdTime，但是不限制于某个模块的rdTime，任意类型rdTime都可以
        //此处未设置rdtime，因为之前关单列表采集已经添加了rtxRdTime
        rdTimeService.splRdTimeRequestAndStore(id);
        headerStoreService.setRdTimeHeader(id, RdTime.Spl);

        JSONObject queries = new JSONObject() {{
            put("entryId", entryId);
        }};
        try {
            String decStatusInfo = queries.toString();
            decStatusInfo = URLEncoder.encode(decStatusInfo, "UTF-8");
            decStatusInfo = URLEncoder.encode(decStatusInfo, "UTF-8");
            decStatusInfo = URLEncoder.encode(decStatusInfo, "UTF-8");
            JSONObject params = new JSONObject();
            params.put("limit", 10);
            params.put("offset", 0);
            params.put("fromCondition", decStatusInfo);
            String response = request.get(REVOKE_LIST_URL, params);
            if (StringUtils.isBlank(response)) return null;
            LOGGER.info("报关单号[{}] -> 修撤单：{}", entryId, response);
            return JSON.parseObject(response);
        } catch (Exception e) {
            LOGGER.error("修撤单查询异常", e);
            return null;
        }
    }

    /**
     * 报关单对应的修撤单
     *
     * @param entryId 出口报关单号
     */
    public DecModType revokeListModType(String id, String entryId) {
        JSONObject revokeList = this.revokeList(id, entryId);
        if (revokeList == null) return DecModType.Unknown;
        JSONArray rows = revokeList.getJSONArray("rows");
        if (rows == null || rows.size() == 0) return DecModType.Unknown;
        //是否存在撤单成功的数据
        boolean revocation = rows.stream().anyMatch(o -> {
            JSONObject item = (JSONObject) o;
            //decModType 修撤单类型：1-修改申请 2-撤销申请
            //decModStatus 修撤单状态： 38-海关审核不同意 39-海关操作成功
            return "2".equals(item.getString("decModType")) && "39".equals(item.getString("decModStatus"));
        });
        return revocation ? DecModType.Revocation : DecModType.Modification;
    }
}
